package cn.iocoder.yudao.module.system.dal.mysql.dict;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataExportReqVO;
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dict.TenantDictDataDO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.ibatis.annotations.Mapper;

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

@Mapper
public interface TenantDictDataMapper extends BaseMapperX<TenantDictDataDO> {

    default TenantDictDataDO selectByDictTypeAndValue(String dictType, String value) {
        return selectOne(TenantDictDataDO::getDictType, dictType, TenantDictDataDO::getValue, value);
    }

    default TenantDictDataDO selectByDictTypeAndLabel(String dictType, String label) {
        return selectOne(TenantDictDataDO::getDictType, dictType, TenantDictDataDO::getLabel, label);
    }

    default List<TenantDictDataDO> selectByDictTypeAndValues(String dictType, Collection<String> values) {
        return selectList(new LambdaQueryWrapper<TenantDictDataDO>().eq(TenantDictDataDO::getDictType, dictType)
                .in(TenantDictDataDO::getValue, values));
    }

    default long selectCountByDictType(String dictType) {
        return selectCount(TenantDictDataDO::getDictType, dictType);
    }

    default PageResult<TenantDictDataDO> selectPage(DictDataPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<TenantDictDataDO>()
                .likeIfPresent(TenantDictDataDO::getLabel, reqVO.getLabel())
                .eqIfPresent(TenantDictDataDO::getDictType, reqVO.getDictType())
                .eqIfPresent(TenantDictDataDO::getStatus, reqVO.getStatus())
                .orderByDesc(Arrays.asList(TenantDictDataDO::getDictType, TenantDictDataDO::getSort)));
    }

    default List<TenantDictDataDO> selectList(DictDataExportReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<TenantDictDataDO>()
                .likeIfPresent(TenantDictDataDO::getLabel, reqVO.getLabel())
                .eqIfPresent(TenantDictDataDO::getDictType, reqVO.getDictType())
                .eqIfPresent(TenantDictDataDO::getStatus, reqVO.getStatus()));
    }

    default List<TenantDictDataDO> selectListByTypeAndStatus(String dictType, Integer status) {
        return selectList(new LambdaQueryWrapper<TenantDictDataDO>()
                .eq(TenantDictDataDO::getDictType, dictType)
                .eq(TenantDictDataDO::getStatus, status));
    }

}
